home *** CD-ROM | disk | FTP | other *** search
/ The Utilities Experience / The Utilities Experience - Volume 1.iso / software / graphics / n-z / raystorexa / examples / sphanim.cpp < prev    next >
Text File  |  1995-10-18  |  9KB  |  356 lines

  1. /***************
  2.  * NAME:          sphanim.cpp
  3.  * VERSION:       1.0 10.08.1995
  4.  * DESCRIPTION:   Little anim of jumping balls
  5.  *                        this program has been compiled with Maxon C++ 3.0
  6.  *    AUTHORS:            Andreas Heumann, Mike Hesser
  7.  * BUGS:          none
  8.  * TO DO:         
  9.  * HISTORY:       DATE        NAME    COMMENT
  10.  *                        10.08.95    ah        first release
  11.  ***************/
  12.  
  13. #include <exec/memory.h>
  14. #include <rexx/storage.h>
  15. #include <rexx/rxslib.h>
  16. #include <exec/types.h>
  17.  
  18. #include <pragma/exec_lib.h>
  19. #include <pragma/rexxsyslib_lib.h>
  20.  
  21. #include <fstream.h>
  22. #include <stdlib.h>
  23. #include <stdio.h>
  24. #include <string.h>
  25. #include <time.h>
  26. #include <iostream.h>
  27. #define c_Radius        1
  28. #define g                15
  29.  
  30. struct Library *RexxSysBase = NULL;
  31. static struct MsgPort *HostPort;
  32. static struct MsgPort *ReplyPort = NULL;
  33. static int msgs = 0;        // remaining messages
  34.  
  35. #define RED        0
  36. #define GREEN    1
  37. #define BLUE    2
  38.  
  39. typedef struct tSphere
  40. {
  41.     float x,y,z;
  42.    float m;
  43.     float vx,vy,vz;
  44.     char color;
  45. };
  46.  
  47. struct tSphere *SpList = NULL;
  48.  
  49. /*************
  50.  * FUNCTION:        SendRexxMsg
  51.  * VERSION:            1.0 08.05.1995
  52.  * DESCRIPTION:    Sends a single command to Rexx host
  53.  * INPUT:            HostPort        pointer to host message port
  54.  *                        SingleMsg    message to send
  55.  * OUTPUT:            none
  56.  * HISTORY:       DATE        NAME        COMMENT
  57.  *                        08.05.95    ah            first release
  58.  *************/
  59. void SendRexxMsg(struct MsgPort *HostPort, char *SingleMsg)
  60. {
  61.     struct RexxMsg *RexxMessage;
  62.  
  63.     while(RexxMessage = (struct RexxMsg*)GetMsg(ReplyPort))
  64.     {
  65.         // Remove Rexx message
  66.         if(RexxMessage->rm_Result1)
  67.            cout << RexxMessage->rm_Args[0] << "-> Error: " << RexxMessage->rm_Result1 << "\n";
  68.         ClearRexxMsg(RexxMessage,1);
  69.         DeleteRexxMsg(RexxMessage);
  70.         msgs--;
  71.     }
  72.  
  73.     // Valid pointers given?
  74.     if(HostPort && SingleMsg)
  75.     {
  76.         // Create a Rexx message
  77.         RexxMessage = (struct RexxMsg *)CreateRexxMsg(ReplyPort,"",NULL);
  78.         if(RexxMessage)
  79.         {
  80.             RexxMessage->rm_Args[0] = CreateArgstring(SingleMsg, strlen(SingleMsg));
  81.             RexxMessage->rm_Action = RXFF_RESULT;
  82.  
  83.             // Send packet
  84.             PutMsg(HostPort,(struct Message *)RexxMessage);
  85.             msgs++;
  86.             WaitPort(ReplyPort);
  87.             RexxMessage = (struct RexxMsg*)GetMsg(ReplyPort);
  88.             // Remove Rexx message
  89.             if(RexxMessage->rm_Result1)
  90.                cout << RexxMessage->rm_Args[0] << "-> Error: " << RexxMessage->rm_Result1 << "\n";
  91.             ClearRexxMsg(RexxMessage,1);
  92.             DeleteRexxMsg(RexxMessage);
  93.             msgs--;
  94.         }
  95.     }
  96. }
  97.  
  98. /*************
  99.  * FUNCTION:        InitObjects
  100.  * VERSION:            1.0 08.05.1995
  101.  * DESCRIPTION:    Initalize sphere positions and attributes
  102.  * INPUT:            pics        amount of pics
  103.  *                        spheres    amount of spheres
  104.  * OUTPUT:            none
  105.  * HISTORY:       DATE        NAME        COMMENT
  106.  *                        08.05.95    ah            first release
  107.  *************/
  108. void InitObjects(int pics,int spheres)
  109. {
  110.     int i;
  111.  
  112.     for(i=0; i<spheres; i++)
  113.     {
  114.         SpList[i].x = float(rand())/RAND_MAX*50+35;
  115.         SpList[i].y = float(rand())/RAND_MAX*50+10;
  116.         SpList[i].z = -(float(rand())/RAND_MAX*50+150);
  117.         SpList[i].m = 1;
  118.         SpList[i].vx = 0;
  119.         SpList[i].vy = float(rand())/RAND_MAX*4-2;
  120.         SpList[i].vz = 40/pics;
  121.         if(rand()<RAND_MAX/3)
  122.         {
  123.             SpList[i].color = RED;
  124.         }
  125.         else
  126.         {
  127.             if(rand()<RAND_MAX/2)
  128.             {
  129.                 SpList[i].color = GREEN;
  130.             }
  131.             else
  132.             {
  133.                 SpList[i].color = BLUE;
  134.             }
  135.         }
  136.     }
  137. }
  138.  
  139. /*************
  140.  * FUNCTION:        MoveObjects
  141.  * VERSION:            1.0 08.05.1995
  142.  * DESCRIPTION:    Move spheres to new position
  143.  * INPUT:            pics        amount of pics
  144.  *                        spheres    amount of spheres
  145.  * OUTPUT:            none
  146.  * HISTORY:       DATE        NAME        COMMENT
  147.  *                        08.05.95    ah            first release
  148.  *************/
  149. void MoveObjects(int pics,int spheres)
  150. {
  151.     int i;
  152.     for(i=0; i<spheres; i++)
  153.     {
  154.         SpList[i].x += SpList[i].vx*(40/pics);
  155.         SpList[i].y += SpList[i].vy*(40/pics);
  156.         SpList[i].z += SpList[i].vz*(40/pics);
  157.         SpList[i].vy -= g*.1;
  158.         if(SpList[i].y <= c_Radius)
  159.         {
  160.             SpList[i].vy = -SpList[i].vy;
  161.         }
  162.     }
  163. }
  164.  
  165. /*************
  166.  * FUNCTION:        SaveObjects
  167.  * VERSION:            1.0 08.05.1995
  168.  * DESCRIPTION:    Send scene via ARexx to RayStorm 
  169.  * INPUT:            pic        number of picture
  170.  *                        spheres    amount of spheres
  171.  * OUTPUT:            none
  172.  * HISTORY:       DATE        NAME        COMMENT
  173.  *                        08.05.95    ah            first release
  174.  *************/
  175. void SaveObjects(int pic,int spheres)
  176. {
  177.     int i;
  178.     char buffer[256];
  179.  
  180.     sprintf(buffer, "SETCAMERA <90,35,0> <%f,35,%f> <0,1,0> 56.25 45", SpList[0].x, SpList[0].z);
  181.     SendRexxMsg(HostPort, buffer);
  182.     SendRexxMsg(HostPort, "POINTLIGHT <150,400,50> SHADOW");
  183.     SendRexxMsg(HostPort, "NEWSURFACE CHECKER");
  184.     SendRexxMsg(HostPort, "REFLECT [50,50,50]");
  185.     SendRexxMsg(HostPort, "DIFFUSE [50,50,200]");
  186.     SendRexxMsg(HostPort, "AMBIENT [50,50,200]");
  187.     SendRexxMsg(HostPort, "IMTEXTURE /textures/checker.itx <0,1,0> <0,0,0> <10,10,10> 23 23 90");
  188.     SendRexxMsg(HostPort, "PLANE CHECKER");
  189.     SendRexxMsg(HostPort, "NEWSURFACE RED");
  190.     SendRexxMsg(HostPort, "DIFFUSE [255,0,0]");
  191.     SendRexxMsg(HostPort, "AMBIENT [255,0,0]");
  192.     SendRexxMsg(HostPort, "NEWSURFACE GREEN");
  193.     SendRexxMsg(HostPort, "DIFFUSE [0,255,0]");
  194.     SendRexxMsg(HostPort, "AMBIENT [0,255,0]");
  195.     SendRexxMsg(HostPort, "NEWSURFACE BLUE");
  196.     SendRexxMsg(HostPort, "DIFFUSE [0,0,255]");
  197.     SendRexxMsg(HostPort, "AMBIENT [0,0,255]");
  198.     for(i=0; i<spheres; i++)
  199.     {
  200.         switch(SpList[i].color)
  201.         {
  202.             case RED:
  203.                 sprintf(buffer, "SPHERE RED <%f,%f,%f> 1", SpList[i].x,  SpList[i].y, SpList[i].z);
  204.                 SendRexxMsg(HostPort, buffer);
  205.                 break;
  206.             case GREEN:
  207.                 sprintf(buffer, "SPHERE GREEN <%f,%f,%f> 1", SpList[i].x,  SpList[i].y, SpList[i].z);
  208.                 SendRexxMsg(HostPort, buffer);
  209.                 break;
  210.             case BLUE:
  211.                 sprintf(buffer, "SPHERE BLUE <%f,%f,%f> 1", SpList[i].x,  SpList[i].y, SpList[i].z);
  212.                 SendRexxMsg(HostPort, buffer);
  213.                 break;
  214.         }
  215.     }
  216.     SendRexxMsg(HostPort, "STARTRENDER");
  217.     sprintf(buffer, "SAVEPIC pics/balls.%04d", pic);
  218.     SendRexxMsg(HostPort, buffer);
  219.     SendRexxMsg(HostPort, "CLEANUP");
  220. }
  221.  
  222. /*************
  223.  * FUNCTION:        cleanup
  224.  * VERSION:            1.0 08.05.1995
  225.  * DESCRIPTION:    close libs ...
  226.  * INPUT:            none
  227.  * OUTPUT:            none
  228.  * HISTORY:       DATE        NAME        COMMENT
  229.  *                        08.05.95    ah            first release
  230.  *************/
  231. void cleanup()
  232. {
  233.     struct RexxMsg *RexxMessage;
  234.  
  235.     if(ReplyPort)
  236.     {
  237.         // free messages
  238.         while(msgs)
  239.         {
  240.             // Wait for message
  241.             WaitPort(ReplyPort);
  242.             // get messages
  243.             while(RexxMessage = (struct RexxMsg*)GetMsg(ReplyPort))
  244.             {
  245.                 // Remove Rexx message
  246.                 ClearRexxMsg(RexxMessage,1);
  247.                 DeleteRexxMsg(RexxMessage);
  248.                 msgs--;
  249.             }
  250.         }
  251.         // Free reply port signal bit
  252.         FreeSignal(ReplyPort->mp_SigBit);
  253.         // Free the replyport itself
  254.         FreeMem(ReplyPort,sizeof(struct MsgPort));
  255.     }
  256.     if (RexxSysBase)
  257.         CloseLibrary(RexxSysBase);
  258.     if(SpList)
  259.         delete [ ] SpList;
  260.     exit(0);
  261. }
  262.  
  263. /*************
  264.  * FUNCTION:        Init
  265.  * VERSION:            1.0 08.05.1995
  266.  * DESCRIPTION:    Open libs, init ports
  267.  * INPUT:            spheres    amount of spheres
  268.  * OUTPUT:            none
  269.  * HISTORY:       DATE        NAME        COMMENT
  270.  *                        08.05.95    ah            first release
  271.  *************/
  272. void Init(int spheres)
  273. {
  274.     // is raystrom already active ?
  275.     HostPort = (struct MsgPort *)FindPort("RAYSTORM");
  276.     if(!HostPort)
  277.     {
  278.         cout << "Raystorm is not running please start it\n";
  279.         cleanup();
  280.     }
  281.     // Allocate a reply port
  282.     ReplyPort = (struct MsgPort *)AllocMem(sizeof(struct MsgPort),MEMF_PUBLIC | MEMF_CLEAR);
  283.     if(ReplyPort)
  284.     {
  285.         ReplyPort->mp_SigBit = AllocSignal(-1);
  286.         if(ReplyPort->mp_SigBit != -1)
  287.         {
  288.             ReplyPort->mp_Node.ln_Type    = NT_MSGPORT;
  289.             ReplyPort->mp_Flags            = PA_SIGNAL;
  290.             ReplyPort->mp_SigTask        = FindTask(NULL);
  291.  
  292.             ReplyPort->mp_MsgList.lh_Head = (struct Node *)&ReplyPort->mp_MsgList.lh_Tail;
  293.             ReplyPort->mp_MsgList.lh_Tail = 0;
  294.             ReplyPort->mp_MsgList.lh_TailPred = (struct Node *)&ReplyPort->mp_MsgList.lh_Head;
  295.         }
  296.     }
  297.  
  298.     // Open rexxsyslib library.
  299.     RexxSysBase = OpenLibrary("rexxsyslib.library",0L);
  300.     if (!RexxSysBase)
  301.     {
  302.         cout << "Can't open rexxsyslib.library\n";
  303.         cleanup();
  304.     }
  305.     SpList = new tSphere[spheres];
  306.     if(!SpList)
  307.     {
  308.         cout << "Not enough memory\n";
  309.         cleanup();
  310.     }
  311.     srand(time(0));
  312. }
  313.  
  314. void main(int argc, char *argv[])
  315. {
  316.     int i,pics;
  317.     int spheres = 10;
  318.  
  319.     // Parse arguments
  320.     if(argc != 2 && argc != 3)
  321.     {
  322.         cout << "Sphereanim V1.0 1995 by Andreas Heumann" << endl;
  323.         cout << "Usage: sphanim picnum [spheres]" << endl;
  324.         cout << "   picnum   - amount of pictures to create" << endl;
  325.         cout << "   spheres  - amount of spheres" << endl;
  326.         cleanup();
  327.     }
  328.     sscanf(argv[1],"%d",&pics);
  329.     if(pics<2)
  330.     {
  331.         cout << "I need at least two pictures to create." << endl;
  332.         cleanup();
  333.     }
  334.     if(argc == 3)
  335.     {
  336.         sscanf(argv[2],"%d",&spheres);
  337.         if(pics<1)
  338.         {
  339.             cout << "I need at least one sphere." << endl;
  340.             cleanup();
  341.         }
  342.     }
  343.  
  344.     Init(spheres);
  345.     InitObjects(pics,spheres);
  346.  
  347.     for(i=0; i<pics; i++)
  348.     {
  349.         SendRexxMsg(HostPort, "SETSCREEN 160 128");
  350.         SendRexxMsg(HostPort, "SETWORLD [0,0,0] [0,0,0]");
  351.         MoveObjects(pics,spheres);
  352.         SaveObjects(i+1,spheres);
  353.     }
  354.  
  355.     cleanup();
  356. }